package com.jml.漏桶算法;


import java.util.concurrent.Semaphore;

/**
 * 漏桶(Leaky Bucket)算法：
 * 请求先进入到漏桶里，漏桶以一定的速度出水，当水流入速度过大或者漏桶已满会直接溢，然后就拒绝请求，可以看出漏桶算法能强行限制数据的传输速率。
 * 直接基于jdk1.5提供的 Semaphore（信号量） 实现 基于AQS实现
 */
public class LouTong {
    //漏桶
    private Semaphore semaphore;

    public LouTong(int permits) {
        semaphore = new Semaphore(permits);
    }

    public boolean tryAcquire() {

        return semaphore.tryAcquire();
    }

    public void release() {
        semaphore.release();
    }

    public static void main(String[] args) {
        LouTong louTong = new LouTong(2);
        for (int i = 0; i < 10; i++) {
            boolean result = louTong.tryAcquire();
            if (!result) {
                System.out.println("被限流啦");
                return;
            }
            System.out.println(Thread.currentThread().getName());
            louTong.release();
        }
    }

    /**
     * 代码中使用
     *
     * @return
     */
    public String test1() {
        LouTong louTong = new LouTong(2);
        boolean result = louTong.tryAcquire();
        if (!result) {
            return "当前人数访问过多，请稍后重试!";
        }
        System.out.println("正常执行业务逻辑代码...");
        try {
            Thread.sleep(3000);
        } catch (Exception e) {

        }
        louTong.release();
        return "end";
    }
}
